//
//  HMStatus.swift
//  iOSWeibo11
//
//  Created by Apple on 16/7/22.
//  Copyright © 2016年 Apple. All rights reserved.
//

import UIKit

/// 微博模型
class HMStatus: NSObject {

    /// 微博ID
    var id: Int64 = 0
    
    /// 微博创建时间
    /// 如果新浪时间转字符串在模型KVC的时候转,会拿新浪时间和KVC设置属性这一刻时间比较.转完后就不会再转了
    var created_at: String? // {
//        didSet {
//            created_at = NSDate.date(created_at!)?.sinaDateDescription()
//        }
//    }
    
    /// 微博信息内容
    var text: String?
    
    /// 微博来源
    var source: String? {
        didSet {
            // KVC设置source时,我们截取需要的字符串
            if let s = self.source {
                // 判断 ""
                if s.characters.count == 0 {
                    source = "来自 **"
                    return
                }
                
                // 有来源
                // 截取字符串
                let nsSource = s as NSString
                
                // 找到 开头 >
                let firstRange = nsSource.rangeOfString(">")
                
                // 找到 结尾 </
                let lastRange = nsSource.rangeOfString("</")
                
                // 截取字符串
                // location: 起始位置
                // length: 长度
                let range = NSRange(location: firstRange.location + 1, length: lastRange.location - firstRange.location - 1)
                
                // 在didSet方里面给自己重新赋值,不会再次出发didSet
                source = nsSource.substringWithRange(range)
            } else {
                // 没有来源
                source = "来自 **"
            }
        }
    }
    
    /// 微博配图    // [Int] , [String: AnyObjcet] -> [[String: AnyObjcet]]
    /*
    [
        {thumbnail_pic:http://ww4.sinaimg.cn/thumbnail/d00970e7jw1f64ogqi4l2j20c80c7gm5.jpg},
        {thumbnail_pic:http://ww4.sinaimg.cn/thumbnail/d00970e7jw1f64ogqi4l2j20c80c7gm5.jpg}
    ]

    */
    var pic_urls: [[String: AnyObject]]? {
        didSet {
            if pic_urls?.count == 0 {
                return
            }
            
            // 数组中有字典
            // 创建数组保存URL
            storePicutureURLs = [NSURL]()
            
            for dict in pic_urls! {
                let urlString = dict["thumbnail_pic"] as? String
                
                let url = NSURL(string: urlString!)
                storePicutureURLs?.append(url!)
            }
        }
    }
    
    /// 直接存放图片的URL
    var storePicutureURLs: [NSURL]?
    
    /// 转发数
    var reposts_count: Int = 0
    
    /// 评论数
    var comments_count: Int = 0
    
    /// 表态数
    var attitudes_count: Int = 0
    
    /// 用户模型
    var user: HMUser? {
        didSet {
            // 设置的是字典
            // 在字典转模型
            // 重新给自己赋值
            // 在didSet里面再次给自己赋值不会调用didSet
//            user = HMUser(dict: [])
        }
    }
    
    /// 被转发微博模型,不一定有
    var retweeted_status: HMStatus?
    
    /// 被转发微博拼接好的文字,带用户名从
    var retweetedText: String?
    
    /// 行高
    var rowHeight: CGFloat = 0
    
    /// 计算行高
    private func calcRowHeight() {
        // cell顶部间距高度(8) + 头像顶部间距(8) + 头像高度(35) + 文字顶部高度(8) + 文字高度(?) + 文字底部(8)
        // 原创配图: + 配图高度(?) + 配图底部(8)
        // 被转发微博: + 被转发文字顶部(8) + 被转发文字(?) + 被转发文字底部(8)
        // 被转发微博配图: + 被转发配图高度(?) + 被转发配图底部间距(8)
        // 底部按钮高度
        
        var height = CellMargin + CellMargin + CellIconWH + CellMargin
        
        // 计算文字高度
        if let text = self.text {
            let nsText = text as NSString
            
            // 计算文字宽高
            // size: CGSize: 最大放文字的大小
            height += nsText.boundingRectWithSize(CGSize(width: UIScreen.width() - 2 * CellMargin, height: CGFloat(MAXFLOAT)), options: NSStringDrawingOptions.UsesLineFragmentOrigin, attributes: [NSFontAttributeName : UIFont.systemFontOfSize(CellFontSize)], context: nil).height
        }
        
        height += CellMargin
        
        // 判断原创配图
        let count = storePicutureURLs?.count ?? 0
        if count > 0 {
            // 有配图,计算配图的高度
            height += calcPictureSzie(storePicutureURLs).height
            
            height += CellMargin
        }
        
        // 判断是否有被转发微博
        if let retweeted_status = self.retweeted_status {
            // 有被转发微博
            height += CellMargin
            
            // 被转发微博文字高度,被转发微博文字加了用户名称的
            let nsRetweetText = retweeted_status.retweetedText! as NSString
            
            height += nsRetweetText.boundingRectWithSize(CGSize(width: UIScreen.width() - 2 * CellMargin, height: CGFloat(MAXFLOAT)), options: NSStringDrawingOptions.UsesLineFragmentOrigin, attributes: [NSFontAttributeName : UIFont.systemFontOfSize(CellFontSize)], context: nil).height
            
            height += CellMargin
            
            // 被转发配图
            let retweetCount = retweeted_status.storePicutureURLs?.count ?? 0
            if retweetCount > 0 {
                height += calcPictureSzie(retweeted_status.storePicutureURLs).height
                
                height += CellMargin
            }
        }
        
        // 底部高度
        height += CellBottomViewHeight
        
        // 所有高度都算好了
        self.rowHeight = height
    }
    
    /// 计算配图的大小
    private func calcPictureSzie(imageURLs: [NSURL]?) -> CGSize {
        
        // 获取图片数量
        let count = imageURLs?.count ?? 0
        
        // 总列数,默认3列
        var numberOfColumn = maxOfColumn
        
        if count == 1 {
            // 只有一个图片,显示1列
            numberOfColumn = 1
        } else if count == 2 || count == 4 {
            // 2个或4个图片显示2列
            numberOfColumn = 2
        }
        
        // 根据 图片数量 计算配图的总大小
        if count == 0 {
            return CGSizeZero
        }
        
        // 计算宽度 = 总列数 * 图片的宽度 + (总列数 - 1) * 图片间距
        let width = CGFloat(numberOfColumn) * StatusPictureViewItemWH + (CGFloat(numberOfColumn) - 1) * ItemMargin
        
        // 2 = (6 + 3 - 1) / 3
        // 3 = (9 + 3 - 1) / 3
        // 1 = (3 + 3 - 1) / 3
        // 总行数 = (总数 + 总列数 - 1) / 总列数, 前提保证都是整数
        let numberOfRow = (count + numberOfColumn - 1) / numberOfColumn
        
        // 计算高度 = 总行数 * 图片高度 + (总行数 - 1) * 图片的间距
        let height = CGFloat(numberOfRow) * StatusPictureViewItemWH + (CGFloat(numberOfRow) - 1) * ItemMargin
        
        return CGSize(width: width, height: height)
    }
    
    init(dict: [String: AnyObject]) {
        super.init()
        
        setValuesForKeysWithDictionary(dict)
        
        // 模型有值了,计算过高度
        self.calcRowHeight()
        /*
        ...
        setValue([String: AnyObject], forKey: "user")
        ...
        */
    }
    
    override func setValue(value: AnyObject?, forKey key: String) {
        if key == "user" {
            // 自己来字典转模型不要系统帮我们设置字典
            // 将value转成字典
            if let dict = value as? [String: AnyObject] {
                // 字典转模型
                user = HMUser(dict: dict)
            }
            
            return
        }
        
        /// 被转发微博
        if key == "retweeted_status" {
            // 自己来字典转模型
            if let dict = value as? [String: AnyObject] {
                // 字典转模型
                retweeted_status = HMStatus(dict: dict)
                
                // 拼接完整的被转发微博内容
                let name = retweeted_status?.user?.screen_name ?? "没有名称"
                let text = retweeted_status?.text ?? "没有微博内容"
                let content = "@\(name): \(text)"
                
                retweeted_status?.retweetedText = content
            }
            
            return
        }
        
        // 其他key走正常的 setValue:forKey:
        super.setValue(value, forKey: key)
    }
    
    /// 字典中的key在模型中找不到对应的属性
    override func setValue(value: AnyObject?, forUndefinedKey key: String) {}
    
    /// 对象打印
    override var description: String {
        get {
            let keys = ["id", "created_at", "text", "source", "pic_urls", "reposts_count", "comments_count", "attitudes_count", "user"]
            // 根据传入的keys,分别拿每一个key去模型找找对应的value,找到了值之后,用key和value拼接成字典
            return "\n\n 微博模型: " + dictionaryWithValuesForKeys(keys).description
        }
    }
}
